

#ifndef _C_ASCII_FONT_H_
#define _C_ASCII_FONT_H_


#include"gl_Graphics.h"


//定义字体尺寸。用于条件编译，减小程序体积。  0 表示不包含这个尺寸，1表示包含这个尺寸

// 1，4，9，16，25，36

#define FontSize16 1  
#define FontSize24 1  
#define FontSize32 0  
#define FontSize40 0  
// #define FontSize48 0    


// 单片机绘制文字的时候，putpixel 速度比较慢，如果有数组缓存，缓存一个字符的区域内存，就可以大大提高绘图速度。
// 为了进一步提高速度，可以使用双缓存，这就遇到另一个问题：自旋锁……  这个还是等后面学了操作系统再改进吧。

/* 
#if(FontSize16 == 1)
#endif
#if(FontSize24 == 1)
#endif
#if(FontSize32 == 1)
#endif
#if(FontSize48 == 1)
#endif

#if(FontSize16 == 1)
#elif(FontSize24 == 1)
#elif(FontSize32 == 1)
#elif(FontSize48 == 1)
#endif

*/

//字体的大小必须是8的倍数。不然字库处理会比较麻烦
typedef enum _FontSize__
{
#if(FontSize16 == 1)
	size16 = 16,
#endif
#if(FontSize24 == 1)
	size24 = 24,
#endif
#if(FontSize32 == 1)
	size32 = 32,
#endif
#if(FontSize40 == 1)
	size40 = 40,
#endif
#if(FontSize48 == 1)
	size48 = 48
#endif
}FontSize;


/// <summary>
/// 字体结构体
/// </summary>
typedef struct _TextFont__  //文本字体
{
	/// <summary>
	/// 字体大小，这里是字体的高度。enum FontSize. 
	/// 关于字体大小的问题：宽字符的英文字符和中文字符一样，宽高相等。 
	/// 宽字符的utf8编码与ascii码也不一样。ascii编码的字符，宽度是高度的一半。
	/// 因此，字体只保留高度即可，知道是否ascii字符，就可以知道字体宽度。  
	/// </summary>
	int size;
	/// <summary>
	/// 显示模式，0透明，1显示背景色。默认透明
	/// </summary>
	int textMode;
	/// <summary>
	/// 背景颜色
	/// </summary>
	COLOR_RGB backColor;
	/// <summary>
	/// 文本颜色
	/// </summary>
	COLOR_RGB textColor;
}TextFont;

extern TextFont TextFont_defaul;


//  宽字符的字体，一律当作中文字符处理了。

/// <summary>
/// 打印宽字符（先要判断字符是否在图片内，再打印）
/// 字符的宽度和高度size一样。
/// size必须是8的倍数。   
/// 字模数组取模方式是从左到右，从上到下，高位在前。
/// 第一个char最高位是左上角的第一行第一个像素点，次高位是左上角第一行第二个像素点。
/// </summary>
/// <param name="x">字符左上角x轴坐标</param>
/// <param name="y">字符左上角y轴坐标</param>
/// <param name="modls">字模数组，阴码（1表示字体的像素）</param>
/// <param name="textfont">字体打印格式</param>
void draw_wide_char(int x, int y, const char* modls, TextFont textfont);

/// <summary>
/// 打印ascii字符（先要判断字符是否在图片内，再打印）
/// 字符宽度是高度size的一半
/// size必须是8的倍数。 如果size是24，ascii字符的宽度就是12位，每行的像素点要扩充到16位，软件运行的时候会忽略扩充的4个比特位，这样做方面换行取模。   
/// 字模数组取模方式是从左到右，从上到下，高位在前。
/// 第一个char最高位是左上角的第一行第一个像素点，次高位是左上角第一行第二个像素点。
/// </summary>
/// <param name="x">字符左上角x轴坐标</param>
/// <param name="y">字符左上角y轴坐标</param>
/// <param name="modls">字模数组，阴码（1表示字体的像素）</param>
/// <param name="textfont">字体打印格式</param>
void draw_ascii_char(int x, int y, const char* modls, TextFont textfont);

/// <summary>
/// 计算中文字符在字库中的索引
/// </summary>
/// <param name="chinese">待匹配的中文字符</param>
/// <returns>中文字符在数组chinese_text 里的索引，没有找到返回-1</returns>
int chinese_index(const char* chinese);
//

/// <summary>
/// 寻找字模数组
/// </summary>
/// <param name="character">待匹配的字符数组的指针，匹配完成后，自动切换到下一个数组。</param>
/// <param name="textfont">字体，不同大小的字体，字库的数组不一样</param>
/// <returns>char* modls 该字符的字模数组。</returns>
const char* character_modls(const char** character, TextFont textfont);

/// <summary>
/// 打印ascii字符串
/// </summary>
/// <param name="x">字符串左上角x轴坐标</param>
/// <param name="y">字符串左上角y轴坐标</param>
/// <param name="str">打印的中文字符串，每3个字符为一组，表示一个汉字</param>
/// <param name="str_len">打印的字符穿长度</param>
/// <param name="textfont">字体打印格式</param>
void draw_string(int x, int y, const char* str, int str_len, TextFont textfont);

////////////////////////////////////////////////////////////////////////////////////////


// 48 的字体，一个汉字要 288 字节，对于一般单片机来说，难以接受。
#define Max_Font_size 32    //  32*32*2 = 2048, 两个汉字就要4k内存，还算可以接受。  40*40*4 = 6400。如果是48*48*4 = 9216
extern unsigned int ima_buffer_index;
extern COLOR_RGB ima_buffer_0[];
extern COLOR_RGB ima_buffer_1[];

/// <summary>
/// 打印ascii字符串。这个是给没有frame 版本的单片机用的。
/// 这里调用image_draw_wide_char，image_draw_ascii_char先将文本画到ima的变量中，再用graphics_draw_image绘制。
/// graphics_draw_image 在单片机中可以用DMA或者中断发送实现。提高运行效率。需要准备两个最大字体的缓存。
/// </summary>
/// <param name="x">字符串左上角x轴坐标</param>
/// <param name="y">字符串左上角y轴坐标</param>
/// <param name="str">打印的中文字符串，每3个字符为一组，表示一个汉字</param>
/// <param name="str_len">打印的字符穿长度</param>
/// <param name="textfont">字体打印格式</param>
void draw_string_no_frame(int x, int y, const char* str, int str_len, TextFont textfont);

/// <summary>
/// 打印ascii字符串。这个是给没有frame 版本的单片机用的。
/// 这里调用image_draw_wide_char，image_draw_ascii_char先将文本画到ima的变量中，再用graphics_draw_image绘制。
/// graphics_draw_image 在单片机中可以用DMA或者中断发送实现。提高运行效率。需要准备两个最大字体的缓存。
/// 注意，这个只能显示不透明的模式。如果是透明模式，会出问题。
/// </summary>
/// <param name="x">字符串左上角x轴坐标</param>
/// <param name="y">字符串左上角y轴坐标</param>
/// <param name="w">绘制区域的宽度</param>
/// <param name="h">绘制区域的高度</param>
/// <param name="str">打印的中文字符串，每3个字符为一组，表示一个汉字</param>
/// <param name="str_len">打印的字符穿长度</param>
/// <param name="textfont">字体打印格式</param>
void draw_string_in_area_no_frame(int x, int y, int w, int h, const char* str, int str_len, TextFont textfont);




/// <summary>
/// 打印ascii字符串。这个是给没有frame 版本的单片机用的。
/// 这里调用image_draw_wide_char，image_draw_ascii_char先将文本画到ima的变量中，再用graphics_draw_image绘制。
/// graphics_draw_image 在单片机中可以用DMA或者中断发送实现。提高运行效率。需要准备两个最大字体的缓存。
/// 带背景icon版本。
/// </summary>
/// <param name="x">字符串左上角x轴坐标</param>
/// <param name="y">字符串左上角y轴坐标</param>
/// <param name="str">打印的中文字符串，每3个字符为一组，表示一个汉字</param>
/// <param name="str_len">打印的字符穿长度</param>
/// <param name="textfont">字体打印格式</param>
/// <param name="ic"> 背景图标 </param>
/// <param name="ic_x">icon在画布上的x位置</param>
/// <param name="ic_y">icon在画布上的y位置</param>
void draw_string_no_frame_on_background(int x, int y, const char* str, int str_len, TextFont textfont, icon ic, int ic_x, int ic_y);


/// <summary>
/// 打印ascii字符串。这个是给没有frame 版本的单片机用的。
/// 这里调用image_draw_wide_char，image_draw_ascii_char先将文本画到ima的变量中，再用graphics_draw_image绘制。
/// graphics_draw_image 在单片机中可以用DMA或者中断发送实现。提高运行效率。需要准备两个最大字体的缓存。
/// 注意，这个只能显示不透明的模式。如果是透明模式，会出问题。
/// </summary>
/// <param name="x">字符串左上角x轴坐标</param>
/// <param name="y">字符串左上角y轴坐标</param>
/// <param name="w">绘制区域的宽度</param>
/// <param name="h">绘制区域的高度</param>
/// <param name="str">打印的中文字符串，每3个字符为一组，表示一个汉字</param>
/// <param name="str_len">打印的字符穿长度</param>
/// <param name="textfont">字体打印格式</param>
/// <param name="ic"> 背景图标 </param>
/// <param name="ic_x">icon在画布上的x位置</param>
/// <param name="ic_y">icon在画布上的y位置</param>
void draw_string_in_area_no_frame_on_background(int x, int y, int w, int h, const char* str, int str_len, TextFont textfont, icon ic, int ic_x, int ic_y);


#endif

